#include "Encryption.h"
#include <android/log.h>
#define LOG_TAG "Encrypt.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
/**
 * 执行加密或解密
 */
void execute(char *oFileName, char *nFileName, char *pw) {
	FILE *fp;

	if ((fp = fopen(oFileName, "r+")) == NULL) {
		return;
	}

	/**
	 * 默认，获取文件首1K数据
	 */
	int encryptSize = 1024;

	fseek(fp, 0, SEEK_END);

	/**
	 * 小于1K，加密全部数据
	 */
	if (ftell(fp) < 1024) {
		encryptSize = ftell(fp) - 1;
	}

	fseek(fp, 0, SEEK_SET);

	char buffer[encryptSize];

	/**
	 * 读取数据
	 */
	int size = fread(buffer, 1, encryptSize, fp);

	int i = 0;
	int n = 0;

	while (i < size) {
		if (pw[n] == 0) {
			n = 0;
		}

		/**
		 * 与密钥异或
		 */
		buffer[i] ^= pw[n];

		i++;
		n++;
	}

	fseek(fp, 0, SEEK_SET);

	/**
	 * 写入数据
	 */
	fwrite(buffer, 1, encryptSize, fp);

	memset(buffer, 0, encryptSize);

	fclose(fp);
	LOGI("source file name,%s",oFileName);
	/**
	 * 移动文件到目标位置
	 */
	rename(oFileName, nFileName);
}

/**
 * 加密
 */
void encrypt(char *oFileName, char *nFileName, char *pw) {
	LOGI("encrypt:sourceName = %s",oFileName);
	LOGI("encrypt:destName = %s",nFileName);
	execute(oFileName, nFileName, pw);
}

/**
 * 解密
 */
void decrypt(char *oFileName, char *nFileName, char *pw) {
	LOGI("decrypt:sourceName = %s",oFileName);
	LOGI("decrypt:destName = %s",nFileName);
	execute(oFileName, nFileName, pw);
}

char keys[100];

/**
 * 生成Keys
 */
void generateKeys() {

	int i;

	for (i = 0 ; i < 100 ; i++) {

		/**
		 * 0-10，m开头，跳5位.
		 */
		if (i < 10) {
			if (i == 0) {
				keys[i] = 109;
			 	continue;
			}

			/**
			 * 小写字母
			 */
			keys[i] = (char) (97 + (keys[i - 1] - 97 + 5) % 26);
		}

		/**
		 * 10-20，A开头，跳8位.
		 */
		if (i >= 10 && i < 20) {
			if (i == 10) {
				keys[i] = 65;
				continue;
			}

			/**
			 * 大写字母
			 */
			keys[i] = (char) (65 + (keys[i - 1] - 65 + 8) % 26);
		}

		/**
		 * 20-30，#开头，跳2位.
		 */
		if (i >= 20 && i < 30) {
			if (i == 20) {
				keys[i] = 35;
				continue;
			}

			/**
			 * 特殊字符
			 */
			keys[i] = 36;
		}

		/**
		 * 30-40，L开头，跳3位.
		 */
		if (i >= 30 && i < 40) {
			if (i == 30) {
				keys[i] = 76;
				continue;
			}

			/**
			 * 大写字母
			 */
			keys[i] = (char) (65 + (keys[i - 1] - 65 + 7) % 26);
		}

		/**
		 * 40-50，i开头，跳2位.
		 */
		if (i >= 40 && i < 50) {
			if (i == 40) {
				keys[i] = 105;
				continue;
			}

			/**
			 * 小写字母
			 */
			keys[i] = (char) (97 + (keys[i - 1] - 97 + 5) % 26);
		}

		/**
		 * 50-60，:开头，跳7位.
		 */
		if (i >= 50 && i < 60) {
			if (i == 50) {
				keys[i] = 58;
				continue;
			}

			/**
			 * 特殊字符
			 */
			keys[i] = 95;
		}

		/**
		 * 60-70，5开头，跳2位.
		 */
		if (i >= 60 && i < 70) {
			if (i == 60) {
				keys[i] = 53;
				continue;
			}

			/**
			 * 数字
			 */
			keys[i] = (char) (48 + (keys[i - 1] - 48 + 2) % 10);
		}

		/**
		 * 70-80，C开头，跳10位.
		 */
		if (i >= 70 && i < 80) {
			if (i == 70) {
				keys[i] = 67;
				continue;
			}

			/**
			 * 大写字母
			 */
			keys[i] = (char) (65 + (keys[i - 1] - 65 + 8) % 26);
		}

		/**
		 * 80-90，n开头，跳2位.
		 */
		if (i >= 80 && i < 90) {
			if (i == 80) {
				keys[i] = 110;
				continue;
			}

			/**
			 * 小写字母
			 */
			keys[i] = (char) (97 + (keys[i - 1] - 97 + 5) % 26);
		}

		/**
		 * 90-100，!开头，跳6位.
		 */
		if (i >= 90 && i < 100) {
			if (i == 90) {
				keys[i] = 33;
				continue;
			}

			/**
			 * 特殊字符
			 */
			keys[i] = 36;
		}
	}
}

/**
 * 对Keys进行DES加密
 */
void encryptKeys() {

	generateKeys();

	int keysH[100];

	int i;

	for (i = 0 ; i < 100 ; i++) {
		keysH[i] = keys[i];
	}

	char * key = "MaYingCai";

	int keyH[8];

	int j;

	for (j = 0 ; j < 8 ; j++) {
		keyH[j] = key[j];
	}

	Encode(keysH, keyH);

	int k;

	for (k = 0; k < 100 ; k++) {
		keys[k] = keysH[k];
	}
}
